package com.zenithmind.mall.pojo.dto;

import lombok.Data;
import jakarta.validation.constraints.*;

import java.math.BigDecimal;
import java.util.List;

/**
 * 商品DTO
 * 
 * @author ZenithMind Team
 * @since 2025-06-09
 */
@Data
public class ProductDTO {

    /**
     * 商品ID（更新时使用）
     */
    private String id;

    /**
     * 商品名称
     */
    @NotBlank(message = "商品名称不能为空")
    @Size(max = 100, message = "商品名称长度不能超过100个字符")
    private String name;

    /**
     * 商品副标题
     */
    @Size(max = 200, message = "商品副标题长度不能超过200个字符")
    private String subtitle;

    /**
     * 商品描述
     */
    @Size(max = 500, message = "商品描述长度不能超过500个字符")
    private String description;

    /**
     * 商品详情
     */
    private String detail;

    /**
     * 商品分类ID
     */
    @NotBlank(message = "商品分类不能为空")
    private String categoryId;

    /**
     * 商品品牌
     */
    @Size(max = 50, message = "商品品牌长度不能超过50个字符")
    private String brand;

    /**
     * 商品型号
     */
    @Size(max = 50, message = "商品型号长度不能超过50个字符")
    private String model;

    /**
     * 商品SKU
     */
    @Size(max = 50, message = "商品SKU长度不能超过50个字符")
    private String sku;

    /**
     * 商品条形码
     */
    @Size(max = 50, message = "商品条形码长度不能超过50个字符")
    private String barcode;

    /**
     * 商品主图
     */
    private String mainImage;

    /**
     * 商品图片列表
     */
    private List<String> images;

    /**
     * 商品价格
     */
    @NotNull(message = "商品价格不能为空")
    @DecimalMin(value = "0.01", message = "商品价格必须大于0")
    @Digits(integer = 8, fraction = 2, message = "商品价格格式不正确")
    private BigDecimal price;

    /**
     * 商品原价
     */
    @DecimalMin(value = "0.01", message = "商品原价必须大于0")
    @Digits(integer = 8, fraction = 2, message = "商品原价格式不正确")
    private BigDecimal originalPrice;

    /**
     * 商品成本价
     */
    @DecimalMin(value = "0.01", message = "商品成本价必须大于0")
    @Digits(integer = 8, fraction = 2, message = "商品成本价格式不正确")
    private BigDecimal costPrice;

    /**
     * 库存数量
     */
    @NotNull(message = "库存数量不能为空")
    @Min(value = 0, message = "库存数量不能小于0")
    private Integer stock;

    /**
     * 预警库存
     */
    @Min(value = 0, message = "预警库存不能小于0")
    private Integer lowStock;

    /**
     * 商品重量（克）
     */
    @Min(value = 0, message = "商品重量不能小于0")
    private Integer weight;

    /**
     * 商品体积（立方厘米）
     */
    @Min(value = 0, message = "商品体积不能小于0")
    private Integer volume;

    /**
     * 商品状态（0-下架，1-上架，2-预售）
     */
    @NotNull(message = "商品状态不能为空")
    @Min(value = 0, message = "商品状态值不正确")
    @Max(value = 2, message = "商品状态值不正确")
    private Integer status;

    /**
     * 是否推荐
     */
    private Integer isRecommend;

    /**
     * 是否新品
     */
    private Integer isNew;

    /**
     * 是否热销
     */
    private Integer isHot;

    /**
     * 商品标签
     */
    private List<String> tags;

    /**
     * 商品属性
     */
    private List<ProductAttributeDTO> attributes;

    /**
     * 商品规格
     */
    private List<ProductSpecificationDTO> specifications;

    /**
     * SEO关键词
     */
    @Size(max = 200, message = "SEO关键词长度不能超过200个字符")
    private String keywords;

    /**
     * SEO描述
     */
    @Size(max = 500, message = "SEO描述长度不能超过500个字符")
    private String seoDescription;

    /**
     * 排序号
     */
    private Integer sortOrder;

    /**
     * 商品属性DTO
     */
    @Data
    public static class ProductAttributeDTO {
        private String name;
        private String value;
    }

    /**
     * 商品规格DTO
     */
    @Data
    public static class ProductSpecificationDTO {
        private String name;
        private List<String> values;
    }
}
